/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Test;

import java.util.ArrayList;

/**
 *
 * @author NiCo
 */
public class InterPoligono {

    public ArrayList<Object[]> recortar(ArrayList<Object[]> P, ArrayList<Object[]> R) {
        ArrayList<Object[]> resultado = new ArrayList<Object[]>();
        P.add(P.get(0));
        R.add(R.get(0));
        if (calcularIntersecciones(P, R)) {
            resultado = intersectar(R, R);
        } else {
            if (contienePunto(P, R.get(0))) {
                resultado = R;
            } else {
                if (contienePunto(R, P.get(0))) {
                    resultado = P;
                }
            }
        }
        return resultado;
    }

    /*
        ExistenIntersecciones ← verdadero
        nuevo.vértice ← A + tp*(B-A)
        nuevo.vértice.original ← falso
        nuevo.t ← tp
        nuevo.entrante ← Es_Entrante( A, B, C, D )
        Insertar( P, A, B, nuevo )
        nuevo.t ← tr
        Insertar( Q, C, D, nuevo )
      C ← D
      D ← Siguiente_Original( R, C )
    A ← B
    B ← Siguiente_Original( P, A )
     */
    private boolean calcularIntersecciones(ArrayList<Object[]> P, ArrayList<Object[]> R) {
        boolean existenIntersecciones = false;
        Object[] A = P.get(0);
        Object[] B = siguienteOriginal(P, A);
        while (B != P.get(0)) {
            Object[] C = R.get(0);
            Object[] D = siguienteOriginal(R, C);
            while (D != R.get(0)) {
                double tp = calcularParametro(A, B, C, D);
                if (0 <= tp && tp <= 1) {
                    double tr = calcularParametro(C, D, A, B);
                    if(0 <= tr && tr <= 1){
                        existenIntersecciones = true;
                    }
                }
            }
        }
        return existenIntersecciones;
    }

    private ArrayList<Object[]> intersectar(ArrayList<Object[]> R, ArrayList<Object[]> R0) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private boolean contienePunto(ArrayList<Object[]> P, Object[] get) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private Object[] siguienteOriginal(ArrayList<Object[]> P, Object[] A) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private double calcularParametro(Object[] A, Object[] B, Object[] C, Object[] D) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
}
